Introduction

In this document we will examine the open dataset from Data.gov regarding NYC Shootings

This is a part of DTSA - 5301 “Data Science as a Field” coursework through the University of Colorado.


Setup and Data Collection

First we will read in the NYPD_Shooting_Incident_Data__Historic.csv from Data.gov. Then store this file locally for future use.

ny_shootings <- read_csv('https://data.cityofnewyork.us/api/views/833y-fsy8/rows.csv?accessType=DOWNLOAD', show_col_types = FALSE)
# if(!file.exists('data'))(dir.create('data'))
# write_csv(ny_shootings, "data/NYPD_Shooting_Incident_Data__Historic.csv")
# Comment out the above after the ititial read 
# ny_shootings <- read_csv('data/NYPD_Shooting_Incident_Data__Historic.csv', show_col_types = FALSE)

Number of rows: 29744

Number of columns: 21

Date range: 01/01/2006 to 12/31/2024

Data Summary: NYPD_Shooting_Incident_Data__Historic

knitr::kable(slice_sample(ny_shootings, n = 5), caption = "NYC Shootings Data")
NYC Shootings Data
INCIDENT_KEY OCCUR_DATE OCCUR_TIME BORO LOC_OF_OCCUR_DESC PRECINCT JURISDICTION_CODE LOC_CLASSFCTN_DESC LOCATION_DESC STATISTICAL_MURDER_FLAG PERP_AGE_GROUP PERP_SEX PERP_RACE VIC_AGE_GROUP VIC_SEX VIC_RACE X_COORD_CD Y_COORD_CD Latitude Longitude Lon_Lat
25452383 11/22/2006 20:15:00 BROOKLYN NA 73 0 NA NA FALSE NA NA NA 45-64 M BLACK HISPANIC 1007190.0 182916.0 40.66872 -73.91731 POINT (-73.91730820799995 40.668717396000034)
233998219 09/23/2021 02:01:00 BRONX NA 42 2 NA MULTI DWELL - PUBLIC HOUS TRUE NA NA NA 18-24 M BLACK 1011047.0 239814.0 40.82488 -73.90318 POINT (-73.90317795599998 40.82487717500004)
23354103 07/05/2006 07:50:00 BROOKLYN NA 81 0 NA GROCERY/BODEGA FALSE UNKNOWN M BLACK 45-64 M BLACK 1003998.8 187611.0 40.68161 -73.92880 POINT (-73.92879814299994 40.681611891000045)
154350740 06/25/2016 20:29:00 BRONX NA 52 0 NA NA FALSE 18-24 M WHITE HISPANIC 25-44 M WHITE HISPANIC 1013114.8 255492.0 40.86790 -73.89564 POINT (-73.89563923699995 40.867902049000065)
83475189 03/02/2012 21:00:00 STATEN ISLAND NA 122 0 NA PVT HOUSE FALSE NA NA NA 25-44 M WHITE 947940.4 159635.7 40.60477 -74.13076 POINT (-74.13076343299997 40.60477334400008)
pander(summary(ny_shootings))
Table continues below
INCIDENT_KEY OCCUR_DATE OCCUR_TIME BORO
Min. : 9953245 Length:29744 Length:29744 Length:29744
1st Qu.: 67321140 Class :character Class1:hms Class :character
Median :109291972 Mode :character Class2:difftime Mode :character
Mean :133850951 NA Mode :numeric NA
3rd Qu.:214741917 NA NA NA
Max. :299462478 NA NA NA
NA NA NA NA
Table continues below
LOC_OF_OCCUR_DESC PRECINCT JURISDICTION_CODE LOC_CLASSFCTN_DESC
Length:29744 Min. : 1.00 Min. :0.0000 Length:29744
Class :character 1st Qu.: 44.00 1st Qu.:0.0000 Class :character
Mode :character Median : 67.00 Median :0.0000 Mode :character
NA Mean : 65.23 Mean :0.3181 NA
NA 3rd Qu.: 81.00 3rd Qu.:0.0000 NA
NA Max. :123.00 Max. :2.0000 NA
NA NA NA’s :2 NA
Table continues below
LOCATION_DESC STATISTICAL_MURDER_FLAG PERP_AGE_GROUP
Length:29744 Mode :logical Length:29744
Class :character FALSE:23979 Class :character
Mode :character TRUE :5765 Mode :character
NA NA NA
NA NA NA
NA NA NA
NA NA NA
Table continues below
PERP_SEX PERP_RACE VIC_AGE_GROUP VIC_SEX
Length:29744 Length:29744 Length:29744 Length:29744
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
NA NA NA NA
NA NA NA NA
NA NA NA NA
NA NA NA NA
Table continues below
VIC_RACE X_COORD_CD Y_COORD_CD Latitude
Length:29744 Min. : 914928 Min. :125757 Min. :40.51
Class :character 1st Qu.:1000094 1st Qu.:183042 1st Qu.:40.67
Mode :character Median :1007826 Median :195506 Median :40.70
NA Mean :1009442 Mean :208722 Mean :40.74
NA 3rd Qu.:1016739 3rd Qu.:239980 3rd Qu.:40.83
NA Max. :1066815 Max. :271128 Max. :40.91
NA NA NA NA’s :97
Longitude Lon_Lat
Min. :-74.25 Length:29744
1st Qu.:-73.94 Class :character
Median :-73.91 Mode :character
Mean :-73.91 NA
3rd Qu.:-73.88 NA
Max. :-73.70 NA
NA’s :97 NA

Read in NY Population Data by Borough

In this next code cell, we will read in the population data for New York City by borough from a CSV file. This data will help us understand the population distribution across different boroughs, which can be useful for our analysis of shooting incidents.

boro_pop_raw <- read_csv('https://data.cityofnewyork.us/api/views/xywu-7bv9/rows.csv?accessType=DOWNLOAD', show_col_types = FALSE)
# write_csv(boro_pop_raw, "data/boro_pop_raw.csv")
#boro_pop_raw <- read_csv("data/boro_pop_raw.csv", show_col_types = FALSE)

Tidy data of Population by Borough

The data available by official sources for the population of New York City is in a wide format. We will need to tidy this data into a long format to make it easier to work with in our analysis.

Additionally, the data is only availble by decade. This is accurate enough for our purposes, but we will do some data assumptions to fill in the gaps for years between the decades. In this case we treat the decade population as the population at the midpoint of the decade, and will use linear interpolation to estimate the population for the years in between.

boro_pop <- boro_pop_raw %>%
  select(Borough, `1950`, `1960`, `1970`, `1980`, `1990`, `2000`, `2010`, `2020`) %>%
  mutate(Borough = toupper(Borough)) # Convert Borough to uppercase

boro_pop_long <- boro_pop %>%
  pivot_longer(
    cols = -Borough, # All columns except Borough
    names_to = "Decade",
    values_to = "Population"
  ) %>%
  mutate(Decade = as.numeric(Decade)) %>% # Convert Decade to numeric
  rename(Year = Decade) # Rename Decade to Year

boro_pop_interpolated <- boro_pop_long %>%
  group_by(Borough) %>%
  complete(Year = full_seq(c(Year, max(Year) + 5), 1)) %>% # Create rows for every year
  arrange(Borough, Year) %>%
  mutate(Population = approx(Year, Population, Year, rule = 2)$y) %>% # Linear interpolation
  mutate(Population = lag(Population, n=5)) %>%
  ungroup()
  
pander(summary(boro_pop_interpolated))
Borough Year Population
Length:456 Min. :1950 Min. : 191555
Class :character 1st Qu.:1969 1st Qu.:1380117
Mode :character Median :1988 Median :1754239
NA Mean :1988 Mean :2599322
NA 3rd Qu.:2006 3rd Qu.:2527506
NA Max. :2025 Max. :8550971
NA NA NA’s :30
# Print a sample of the interpolated data
knitr::kable(tail(boro_pop_interpolated), caption = "Boruough population interpolated from decade to years")
Boruough population interpolated from decade to years
Borough Year Population
STATEN ISLAND 2020 477942.5
STATEN ISLAND 2021 479785.0
STATEN ISLAND 2022 481627.5
STATEN ISLAND 2023 483470.0
STATEN ISLAND 2024 485312.5
STATEN ISLAND 2025 487155.0

Shootings per Borough per Year

In this section, we will analyze the number of murders per borough per year. This will help us understand the distribution of murders across different boroughs and how it changes over time.

First we will organize our data to group by boro and year. Here is the summary of our new table which shows the range and variance of the years and murder volume.

# Change "OCCUR_DATE" to an actual date datatype
ny_shootings <- ny_shootings %>%
  mutate(OCCUR_DATE = as.Date(OCCUR_DATE, format="%m/%d/%Y"))

# Extract the year from OCCUR_DATE and create a new column
ny_shootings <- ny_shootings %>%
  mutate(YEAR = lubridate::year(OCCUR_DATE))

# Group by borough and year and summarize only the murders
boro_deaths <- ny_shootings %>%
  group_by(BORO, YEAR) %>%
  summarize(murders = sum(STATISTICAL_MURDER_FLAG == TRUE, na.rm = TRUE), .groups = "drop") %>%
  ungroup()

pander(summary(boro_deaths))
BORO YEAR murders
Length:95 Min. :2006 Min. : 0.00
Class :character 1st Qu.:2010 1st Qu.: 24.50
Mode :character Median :2015 Median : 48.00
NA Mean :2015 Mean : 60.68
NA 3rd Qu.:2020 3rd Qu.: 88.50
NA Max. :2024 Max. :182.00

Convert to Per Capita View

In order to get a more accurate understanding of the murder rate across the 5 boroughs, we will join the shooting data with the population data to calculate the number of shootings per capita. This will allow us to compare the murder rates across boroughs more fairly, accounting for differences in population size.

# Join with population to see a per capita View
boro_combined <- boro_deaths %>%
  left_join(boro_pop_interpolated, by = c("BORO" = "Borough", "YEAR" = "Year"))
boro_combined <- boro_combined %>%
  mutate(murders_per_capita = murders / Population)

pander(summary(boro_combined))
Table continues below
BORO YEAR murders Population
Length:95 Min. :2006 Min. : 0.00 Min. : 446228
Class :character 1st Qu.:2010 1st Qu.: 24.50 1st Qu.:1361502
Mode :character Median :2015 Median : 48.00 Median :1585873
NA Mean :2015 Mean : 60.68 Mean :1652030
NA 3rd Qu.:2020 3rd Qu.: 88.50 3rd Qu.:2286134
NA Max. :2024 Max. :182.00 Max. :2638898
murders_per_capita
Min. :0.000e+00
1st Qu.:1.967e-05
Median :2.779e-05
Mean :3.523e-05
3rd Qu.:4.667e-05
Max. :1.195e-04
knitr::kable(slice_sample(boro_combined, n = 5), caption = "Adds per capita view")
Adds per capita view
BORO YEAR murders Population murders_per_capita
STATEN ISLAND 2013 4 463729.6 0.0000086
MANHATTAN 2018 15 1601595.4 0.0000094
BRONX 2021 170 1422116.0 0.0001195
BRONX 2017 52 1397444.0 0.0000372
QUEENS 2006 59 2231441.3 0.0000264

Visualizing per Capita Murders by Borough

plot_ly(boro_combined, x = ~YEAR, y = ~murders_per_capita, color = ~BORO, 
        type = 'scatter', mode = 'lines') %>%
  layout(title = "Murders Over Time by Borough",
         xaxis = list(title = "Date"),
         yaxis = list(title = "Murders per Capita"))

We can see that for many Boroughs, the per capita shooting rates have been in decline since the data began being recorded. This suggests improvements in safety or changes in reporting over time. However, in the years of 2020 and 2021, there appears to be a significant increase in murder rates, which may be attributed to various social and economic factors during that period.

Key Findings:

Pre-Pandemic Trends (2006-2019):

  • All five boroughs showed a general decline in per capita murder rates from the mid-2000s through 2019
  • The Bronx and Brooklyn consistently had the highest murder rates per capita throughout this period
  • Manhattan, Queens, and Staten Island maintained relatively lower and more stable rates

COVID-19 Pandemic Impact (2020-2021):

  • Universal Spike: All five boroughs experienced a sharp increase in murder rates beginning in 2020
  • Disproportionate Impact: The Bronx showed the most dramatic surge, with its per capita murder rate nearly doubling and reaching approximately 1.25 deaths per 10,000 residents (the highest point on the chart)
  • Brooklyn: Also experienced a significant increase, though somewhat less pronounced than the Bronx
  • Other Boroughs: Manhattan, Queens, and Staten Island saw increases as well, but their rates remained substantially lower than the Bronx and Brooklyn

Post-Peak Trends (2022-2023):

  • The data suggests a beginning of decline from the 2020-2021 peaks across most boroughs
  • However, rates remain elevated compared to 2019 pre-pandemic levels
  • This pattern highlights how the social and economic disruptions of the COVID-19 pandemic exacerbated existing disparities in violence across NYC neighborhoods, with historically underserved communities in the Bronx and Brooklyn bearing the greatest burden.

Visualizing Age and Race for Shooting Victims

In the next section we will look for patterns in the type of victims of shootings.

First we will examine the age and race distribution of shooting victims

ny_shootings %>%
  count(VIC_AGE_GROUP) %>%
  pander()
VIC_AGE_GROUP n
1022 1
18-24 10677
25-44 13563
45-64 2118
65+ 236
<18 3081
UNKNOWN 68
ny_shootings %>%
  count(VIC_RACE) %>%
  pander()
VIC_RACE n
AMERICAN INDIAN/ALASKAN NATIVE 13
ASIAN / PACIFIC ISLANDER 478
BLACK 20999
BLACK HISPANIC 2930
UNKNOWN 72
WHITE 741
WHITE HISPANIC 4511

There is one data point in the VIC_AGE_GROUP column that appears to be an outlier or error. The value of 1022 does not correspond to a valid age group and should be investigated or removed from the analysis.

vic_demo <- ny_shootings %>%
  filter(!VIC_AGE_GROUP %in% c("1022"))

vic_demo <- vic_demo %>%
  group_by(VIC_AGE_GROUP, VIC_SEX, VIC_RACE) %>%
  summarize(total_victims = n(), .groups = "drop")

# Create interactive plotly chart
plot_ly(vic_demo, x = ~VIC_AGE_GROUP, y = ~total_victims, color = ~VIC_RACE, 
        type = 'bar') %>%
  layout(title = "Victim Demographics in NYC Shootings",
         xaxis = list(title = "Age Group"),
         yaxis = list(title = "Number of Victims"),
         barmode = 'group',  # This creates the dodged/grouped bars
         legend = list(title = list(text = "Race")))

Shootings seem to disproportionately affect certain age groups and racial demographics. However, we are not comparing these demographics to overall population ratios at this point. In order to surface any hypothesis here we will also need to find the relative popultation means and distributions for these demographics.


Build Logistic Regression Model

In the next Section we will build a logistic regression model to predict the likelihood of a murder based on various factors.

While this may produce insights, it is important to remember that we are only looking at the total count of shootings and looking for correlations where that shooting becomes a statistical murder.

Generalized Linear Model

Below we will build a generalized linear model to predict the likelihood of a murder based on severaly features in our dataset. GLM’s allow for modeling of binary outcomes and can provide insights into the factors that influence the probability of an event occurring.

# Create model specific data set
model_data <- ny_shootings %>%
  mutate(murder_flag = as.numeric(STATISTICAL_MURDER_FLAG)) %>%
  select(murder_flag, BORO, YEAR, PERP_AGE_GROUP, PERP_RACE, VIC_AGE_GROUP, VIC_RACE) %>%
  na.omit()

model <- glm(murder_flag ~ BORO + YEAR + PERP_AGE_GROUP + PERP_RACE + VIC_AGE_GROUP + VIC_RACE,
             data = model_data, family = "binomial")
# Example: Highlight significant p-values in the model summary
tidy_model <- broom::tidy(model)

# Create color vector that handles NA values
p_value_colors <- ifelse(is.na(tidy_model$p.value), "black",
                         ifelse(tidy_model$p.value < 0.05, "red", "black"))

tidy_model %>%
  knitr::kable(caption = "Model Summary", digits = 4) %>%
  kable_styling(bootstrap_options = c("striped", "hover")) %>%
  column_spec(5, bold = TRUE, color = p_value_colors) %>%
  footnote(general = "Red values indicate statistical significance (p < 0.05)")
Model Summary
term estimate std.error statistic p.value
(Intercept) -4.1854 152.9892 -0.0274 0.9782
BOROBROOKLYN -0.1170 0.0459 -2.5489 0.0108
BOROMANHATTAN -0.1556 0.0573 -2.7155 0.0066
BOROQUEENS -0.1452 0.0577 -2.5170 0.0118
BOROSTATEN ISLAND -0.1958 0.1027 -1.9077 0.0564
YEAR -0.0047 0.0034 -1.4042 0.1603
PERP_AGE_GROUP<18 0.4555 0.1090 4.1796 0.0000
PERP_AGE_GROUP1020 -11.8577 535.4112 -0.0221 0.9823
PERP_AGE_GROUP1028 -11.6239 535.4112 -0.0217 0.9827
PERP_AGE_GROUP18-24 0.5635 0.0946 5.9593 0.0000
PERP_AGE_GROUP2021 -11.5474 535.4112 -0.0216 0.9828
PERP_AGE_GROUP224 -11.8883 535.4112 -0.0222 0.9823
PERP_AGE_GROUP25-44 0.8123 0.0928 8.7548 0.0000
PERP_AGE_GROUP45-64 1.1055 0.1161 9.5222 0.0000
PERP_AGE_GROUP65+ 1.1106 0.2737 4.0576 0.0000
PERP_AGE_GROUP940 -11.9076 535.4112 -0.0222 0.9823
PERP_AGE_GROUPUNKNOWN -1.5967 0.1590 -10.0394 0.0000
PERP_RACEAMERICAN INDIAN/ALASKAN NATIVE -12.6179 378.5670 -0.0333 0.9734
PERP_RACEASIAN / PACIFIC ISLANDER 0.2028 0.1786 1.1350 0.2564
PERP_RACEBLACK -0.1065 0.0553 -1.9275 0.0539
PERP_RACEBLACK HISPANIC -0.1406 0.0796 -1.7660 0.0774
PERP_RACEUNKNOWN 0.1508 0.1436 1.0505 0.2935
PERP_RACEWHITE 0.3991 0.1430 2.7913 0.0052
PERP_RACEWHITE HISPANIC NA NA NA NA
VIC_AGE_GROUP1022 -11.8536 535.4112 -0.0221 0.9823
VIC_AGE_GROUP18-24 0.2283 0.0701 3.2558 0.0011
VIC_AGE_GROUP25-44 0.3788 0.0692 5.4705 0.0000
VIC_AGE_GROUP45-64 0.4370 0.0893 4.8911 0.0000
VIC_AGE_GROUP65+ 0.7089 0.1759 4.0306 0.0001
VIC_AGE_GROUPUNKNOWN 0.1701 0.3486 0.4880 0.6256
VIC_RACEASIAN / PACIFIC ISLANDER 11.9447 152.8362 0.0782 0.9377
VIC_RACEBLACK 11.7660 152.8361 0.0770 0.9386
VIC_RACEBLACK HISPANIC 11.5547 152.8361 0.0756 0.9397
VIC_RACEUNKNOWN 10.9219 152.8368 0.0715 0.9430
VIC_RACEWHITE 11.8120 152.8361 0.0773 0.9384
VIC_RACEWHITE HISPANIC 11.8169 152.8361 0.0773 0.9384
Note:
Red values indicate statistical significance (p < 0.05)

In the above output, we can look for features that have a significant impact on the likelihood of a murder given a shooting happened.

Important note is to look for the coefficients and their statistical significance to understand which factors are most influential.

Interpreting Significant Predictors

The features highlighted in red show statistical significance (p < 0.05), meaning:

  • These factors have a reliable relationship with shooting lethality that cannot be attributed to random variation
  • The model is confident (>95%) that these variables genuinely influence whether a shooting becomes a murder
  • Variables with positive coefficients increase the odds of a fatal outcome
  • Variables with negative coefficients decrease the odds of a fatal outcome

For example: - If VIC_AGE_GROUP65+ has a positive coefficient and p < 0.05, we can conclude that victims over 65 are significantly more likely to die from gunshot wounds compared to the reference age group - If YEAR has a negative coefficient and p < 0.05, it suggests that shootings have become less lethal over time, controlling for other factors

Limitations of P-Values

While statistical significance indicates a relationship exists, it does not tell us:

  1. Causation: Correlation ≠ causation. These factors may be correlated with lethality without directly causing it
  2. Practical Significance: A statistically significant effect may be too small to matter in real-world terms
  3. Confounding Variables: Other unmeasured factors may be the true drivers of the relationship
  4. Model Assumptions: The conclusions depend on the model being correctly specified

Example: If victim race shows significance, this likely reflects systemic inequalities in access to emergency medical care, not inherent biological differences.


Use Predictive Modeling

Below we will use our predictive model to visualize the prediction probability organized buy a specific feature. While this has some interesting information, we must also recognize that this is only one feature of the data and there may be confounding variables to consider.

model_data <- model_data %>%
  mutate(predicted_prob = predict(model, type = "response"))

model_data_filtered <- model_data %>%
  filter(!VIC_AGE_GROUP %in% c("1020",
                               "1028",
                               "2021",
                               "224",
                               "940"))

# Create interactive plotly boxplot
plot_ly(model_data_filtered, y = ~predicted_prob, x = ~VIC_AGE_GROUP, 
        color = ~VIC_AGE_GROUP, type = "box") %>%
  layout(title = "Predicted Probability of Murder by Victim Age Group",
         xaxis = list(title = "Victim Age Group"),
         yaxis = list(title = "Predicted Probability"),
         showlegend = FALSE)

In this visual we can see that as age increase, shootings are more leathal when the victim is older.

Bias

There are many opportunities for bias in this analysis, including data collection, feature selection, and model assumptions. It is important to further critically evaluate these factors to ensure that the conclusions drawn are valid and fair.

Data Collection Bias

This analysis did not validate the methods of data collection or examine potential biases in how the data was gathered, which could affect the results.

Feature Selection Bias

The choice of features included in the model may show some correlation with the outcome but could be proxies for other underlying factors not included in the analysis.

Outliers

Outliers or missing data in the data could disproportionately influence the model’s results, leading to misleading conclusions. A deeper examination of outliers and their impact on the analysis was not conducted.

Population Estimates

The population data used for per capita calculations were estimates and may not accurately reflect the true population during the years analyzed, potentially skewing the results.


Conclusion

This analysis highlights disparities in gun violence between NYC neighborhoods and demonstrates how crisis events like the COVID-19 pandemic might exacerbate existing inequalities.


Session Info

pander(sessionInfo())

R version 4.3.3 (2024-02-29)

Platform: x86_64-pc-linux-gnu (64-bit)

locale: LC_CTYPE=en_US.UTF-8, LC_NUMERIC=C, LC_TIME=en_US.UTF-8, LC_COLLATE=en_US.UTF-8, LC_MONETARY=en_US.UTF-8, LC_MESSAGES=en_US.UTF-8, LC_PAPER=en_US.UTF-8, LC_NAME=C, LC_ADDRESS=C, LC_TELEPHONE=C, LC_MEASUREMENT=en_US.UTF-8 and LC_IDENTIFICATION=C

attached base packages: stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: kableExtra(v.1.4.0), plotly(v.4.11.0), pander(v.0.6.6), details(v.0.4.0), lubridate(v.1.9.4), forcats(v.1.0.1), stringr(v.1.5.2), dplyr(v.1.1.4), purrr(v.1.1.0), readr(v.2.1.5), tidyr(v.1.3.1), tibble(v.3.3.0), ggplot2(v.4.0.0) and tidyverse(v.2.0.0)

loaded via a namespace (and not attached): sass(v.0.4.10), generics(v.0.1.4), xml2(v.1.4.1), stringi(v.1.8.7), hms(v.1.1.4), digest(v.0.6.37), magrittr(v.2.0.4), evaluate(v.1.0.5), grid(v.4.3.3), timechange(v.0.3.0), RColorBrewer(v.1.1-3), fastmap(v.1.2.0), jsonlite(v.2.0.0), backports(v.1.5.0), httr(v.1.4.7), crosstalk(v.1.2.2), viridisLite(v.0.4.2), scales(v.1.4.0), textshaping(v.1.0.4), lazyeval(v.0.2.2), jquerylib(v.0.1.4), cli(v.3.6.5), crayon(v.1.5.3), rlang(v.1.1.6), bit64(v.4.6.0-1), withr(v.3.0.2), cachem(v.1.1.0), yaml(v.2.3.10), parallel(v.4.3.3), tools(v.4.3.3), tzdb(v.0.5.0), broom(v.1.0.10), curl(v.7.0.0), vctrs(v.0.6.5), R6(v.2.6.1), png(v.0.1-8), lifecycle(v.1.0.4), bit(v.4.6.0), htmlwidgets(v.1.6.4), vroom(v.1.6.6), pkgconfig(v.2.0.3), desc(v.1.4.3), clipr(v.0.8.0), pillar(v.1.11.1), bslib(v.0.9.0), gtable(v.0.3.6), glue(v.1.8.0), data.table(v.1.17.8), Rcpp(v.1.1.0), systemfonts(v.1.3.1), xfun(v.0.54), tidyselect(v.1.2.1), rstudioapi(v.0.17.1), knitr(v.1.50), farver(v.2.1.2), htmltools(v.0.5.8.1), svglite(v.2.2.2), rmarkdown(v.2.30), compiler(v.4.3.3) and S7(v.0.2.0)